//
//  FunctionVC.swift
//  ReviewSwift
//
//  Created by ladystyle100 on 2017/8/25.
//  Copyright © 2017年 WangXQ. All rights reserved.
//

import UIKit

enum FuncType: Int {
    case 加 = 0
    case 减 = 1
}

/** 别名函数类型(函数 == 闭包, 闭包就是函数, 函数就是闭包 😆) */
typealias TestFunc = (Int, Int) -> Int

class FunctionVC: UIViewController {
    
    /** 函数为属性 */
    var newFunc: TestFunc?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.white
        
        /**
         *  总体来说, 就是函数可以作为属性, 返回值, 参数等等...
         */
        
        // 获取加函数
        let a = self.getFunc(.加)
        // 传需要的参数进去
        let b = a(1, 2)
        print(b)
        
        // 获取减函数
        let c = self.getFunc(.减)
        let d = c(3, 1)
        print(d)
        
        
        // 把函数作为参数
        print(self.funcParam(a))
        print(self.funcParam(c))
        
        
        // 给函数属性赋值
        self.newFunc = a
        print(self.newFunc!(10, 80))
        
    }
    
    /** 根据官方标准写法 (x = 外部显示名字, y = 内部使用名字)
     *  完整写法: 修饰词 func 函数名 (x y: 类名, x y: 类名......) -> 返回值 { }
     */
    
    // 返回函数
    private func getFunc(_ type: FuncType) -> TestFunc {
        
        // 写在里面
        func subtract(_ a: Int, with b: Int) -> Int {
            return a - b
        }
        
        // 根据传入的参数, 返回不同的函数
        switch type {
        case .减:
            return subtract
        case .加:
            return add
        }
    }
    // 返回的函数, 可以写在外面, 也可以写在里面
    func add(_ a: Int, with b: Int) -> Int {
        return a + b
    }
    
    
    // 把函数作为参数传入
    func funcParam(_ function: TestFunc) -> Int {
        return (function(3, 4) + 5)
    }
    
}














